package main

import (
	"fmt"
	"reflect"
)

func main11() {
	user := &User{
		Name: "A",
		Age:  18,
	}

	// 无参方法——GetUserInfo的调用
	result := dynamicCall(user, "GetUserInfo", nil)

	// 处理返回值
	userInfo := result[0].(string)
	fmt.Println(userInfo)
}

// 该函数接收对象-obj, method-方法名, 参数列表
func dynamicCall(obj interface{}, methodName string, args []interface{}) []interface{} {
	getValue := reflect.ValueOf(obj)

	// 获得方法对象
	method := getValue.MethodByName(methodName)

	// 判断方法是否可用
	if !method.IsValid() {
		fmt.Printf("未找到名为%s的方法\n", methodName)
		return nil
	}

	// 构造动态调用所需的参数列表
	argValues := make([]reflect.Value, 0)
	for _, arg := range args {
		of := reflect.ValueOf(arg)
		argValues = append(argValues, of)
	}

	// 执行动态调用
	returnValues := method.Call(argValues)

	// 构造返回值列表
	result := make([]interface{}, len(returnValues))
	for i := 0; i < len(returnValues); i++ {
		result[i] = transferVal(returnValues[i])
	}
	return result
}

func transferVal(value reflect.Value) interface{} {
	kind := value.Kind()
	switch kind {
	case reflect.Bool:
		return value.Bool()
	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
		return value.Int()
	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
		return value.Int()
	case reflect.Float32, reflect.Float64:
		return value.Float()
	case reflect.String:
		return value.String()
	default:
		return value.Interface()
	}
}
